home *** CD-ROM | disk | FTP | other *** search
- TITLE 32-Bit x 32-Bit Signed Multiply (EX42.ASM)
- PAGE ,132
- OUR_DATA SEGMENT PARA 'DATA'
- HI_MCND DW ?
- LO_MCND DW ?
- HI_PP1 DW ?
- LO_PP1 DW ?
- HI_PP2 DW ?
- LO_PP2 DW ?
- HI_PP3 DW ?
- LO_PP3 DW ?
- HI_PP4 DW ?
- LO_PP4 DW ?
- NEG_IND DB ?
- OUR_DATA ENDS
- OUR_CODE SEGMENT PARA 'CODE'
- PUBLIC MULS32
- MULS32 PROC FAR
- ASSUME CS:OUR_CODE,DS:OUR_DATA
- ;
- ; Initialize the data segment address.
- ;
- PUSH DS ;Save caller's DS and DI
- PUSH DI
- MOV DI,OUR_DATA ;Initialize DS
- MOV DS,DI
- ;
- ; The main procedure follows.
- ;
- MOV NEG_IND,0 ;Negative indicator = 0
- CMP DX,0 ;Multiplicand negative?
- JNS CHKCX ; No. Go check multiplier
- NOT AX ; Yes. 2s-comp. multiplicand
- NOT DX
- ADD AX,1
- ADC DX,0
- NOT NEG_IND ; and 1s-comp. indicator
- CHKCX: CMP CX,0 ;Multiplier negative?
- JNS GOMUL ; No. Go multiply
- NOT BX ; Yes. 2s-comp. multiplier
- NOT CX
- ADD BX,1
- ADC CX,0
- NOT NEG_IND ; and 1s-comp. indicator
- ;
- ; This is the MULU32 code.
- ;
- GOMUL: MOV HI_MCND,DX ;Save multiplicand in memory
- MOV LO_MCND,AX
- MUL BX ;Form partial product #1
- MOV HI_PP1,DX ; and save it in memory
- MOV LO_PP1,AX
- MOV AX,HI_MCND ;Form partial product #2
- MUL BX
- MOV HI_PP2,DX ; and save it in memory
- MOV LO_PP2,AX
- MOV AX,LO_MCND ;Form partial product #3
- MUL CX
- MOV HI_PP3,DX ; and save it in memory
- MOV LO_PP3,AX
- MOV AX,HI_MCND ;Form partial product #4
- MUL CX
- MOV HI_PP4,DX ; and save it in memory
- MOV LO_PP4,AX
- MOV AX,LO_PP1 ;Low 16 bits
- MOV BX,HI_PP1 ;Form mid-lower 16 bits
- ADD BX,LO_PP2 ; with sum #1
- ADC HI_PP2,0
- ADD BX,LO_PP3 ; and sum #2
- MOV CX,HI_PP2 ;Form mid-upper 16 bits
- ADC CX,HI_PP3 ; with sum #3
- ADC HI_PP4,0
- ADD CX,LO_PP4 ; and sum #4
- MOV DX,HI_PP4 ;Form high 16 bits
- ADC DX,0 ; including propagated carry
- ;
- ; End of MULU32 code.
- ;
- CMP NEG_IND,0 ;Does product have right sign?
- JZ DONE ; Yes. Exit.
- NOT AX ; No. 2s-comp. product
- NOT BX
- NOT CX
- NOT DX
- ADD AX,1
- ADC BX,0
- ADC CX,0
- ADC DX,0
- DONE: POP DI ;Restore caller's registers
- POP DS
- RET
- MULS32 ENDP
- OUR_CODE ENDS
- END MULS32
-